19857
518
Я певний час возився з JSON, просто виштовхуючи його як текст, і це нікому не зашкодило (про що я знаю), але я хотів би почати робити все належним чином.
Я бачив стільки передбачуваних "стандартів" для типу вмісту JSON:
application / json
application / x-javascript
текст / javascript
text / x-javascript
text / x-json
Але який з них правильний, чи найкращий? Я розумію, що існують різні проблеми з безпекою та підтримкою браузера.
Я знаю, що є подібне запитання: Який тип MIME, якщо JSON повертається REST API ?, але я хотів би трохи більш цілеспрямованої відповіді. 
1
2
Далі
Для тексту JSON:
application / json
Тип носія MIME для тексту JSON - це application / json. Кодування за замовчуванням - UTF-8. (Джерело: RFC 4627).
Для JSONP (запущений JavaScript) із зворотним викликом:
заявка / javascript
Ось кілька дописів у блозі, які згадувались у відповідних коментарях:
Чому ви не повинні використовувати text / html для JSON
Internet Explorer іноді має проблеми з application / json
Досить повний перелік міметипів і для чого їх використовувати
Офіційний список типів mime на IANA із відповіді @ gnrfan нижче
|
IANA зареєструвала офіційний тип MIME для JSON як application / json.
На запитання про те, чому не text / json, Крокфорд, схоже, сказав, що JSON насправді не є ні JavaScript, ні текстом, а також IANA частіше роздавала application / *, ніж text / *.
Більше ресурсів:
Типи носіїв
Запит на коментарі 4627
bluesmoon: JSON має тип
|
Для JSON:
Тип вмісту: application / json
Для JSON-P:
Тип вмісту: додаток / javascript
|
Звичайно, правильним типом носія MIME для JSON є application / json, але необхідно усвідомити, який тип даних очікується у вашій програмі.
Наприклад, я використовую Ext GWT, і відповідь сервера повинна йти як text / html, але містить дані JSON.
На стороні клієнта, прослуховувач форми Ext GWT
uploadForm.getForm (). addListener (новий FormListenerAdapter ()
{
@Override
public void onActionFailed (форма форми, int httpStatus, String responseText)
{
MessageBox.alert ("Помилка");
}
@Override
public void onActionComplete (форма форми, int httpStatus, String responseText)
{
MessageBox.alert ("Успіх");
}
});
У випадку використання типу відповіді application / json, браузер пропонує мені зберегти файл.
Фрагмент вихідного коду на стороні сервера за допомогою Spring MVC
повернути новий AbstractUrlBasedView ()
{
@SuppressWarnings ("не позначено")
@Override
protected void renderMergedOutputModel (модель карти, запит HttpServletRequest,
HttpServletResponse відповідь) викидає виняток
{
response.setContentType ("text / html");
response.getWriter (). write (json);
}
};
|
JSON:
Відповідь - це динамічно генеровані дані відповідно до параметрів запиту, переданих в URL-адресі.
Приклад:
{"Name": "Foo", "Id": 1234, "Rank": 7}
Тип вмісту: application / json
JSON-P:
JSON із заповненням.
Відповідь - це дані JSON, навколо яких обгорнутий виклик функції.
Приклад:
functionCall ({"Name": "Foo", "Id": 1234, "Rank": 7});
Тип вмісту: додаток / javascript
|
Якщо ви використовуєте Ubuntu або Debian, і ви обслуговуєте файли .json через Apache, можливо, вам доведеться обслуговувати файли правильного типу вмісту. Я роблю це насамперед тому, що хочу використовувати розширення Firefox JSONView
Модуль Apache mod_mime допоможе зробити це легко. Однак з Ubuntu вам потрібно відредагувати файл /etc/mime.types і додати рядок
application / json json
Потім перезапустіть Apache:
sudo service apache2 перезапустити
|
Якщо ви викликаєте веб-служби ASP.NET з клієнтської сторони, вам потрібно використовувати application / json, щоб вона працювала. Я вважаю, що це те саме для фреймворків jQuery та Ext.
|
Правильним типом вмісту для JSON є application / json, ПОКЛИ ви не використовуєте JSONP, також відомий як JSON with Padding, що насправді є JavaScript, тому правильним типом вмісту буде application / javascript.
|
Немає сумнівів, що application / json - найкращий тип MIME для відповіді JSON.
Але я мав певний досвід, коли мені доводилось використовувати application / x-javascript через деякі проблеми стиснення. Моє середовище хостингу - спільний хостинг з GoDaddy. Вони не дозволяють мені змінювати конфігурації сервера. Я додав наступний код у свій файл web.config для стиснення відповідей.

<схема імені = "gzip" dll = "% Windir% \ system32 \ inetsrv \ gzip.dll" />














Використовуючи це, сторінки .aspx стискалися за допомогою g-zip, але відповіді JSON - ні. я додав

у розділах статичного та динамічного типів. Але це зовсім не стискає відповіді JSON.
Після цього я видалив цей нещодавно доданий тип і додав

як у розділах статичного, так і динамічного типів, і змінив тип відповіді в
.ashx (асинхронний обробник) до
application / x-javascript
І тепер я виявив, що мої відповіді JSON були стиснуті за допомогою g-zip. Тому я особисто рекомендую використовувати
application / x-javascript
лише якщо ви хочете стиснути свої відповіді JSON у середовищі спільного хостингу. Оскільки в спільному хостингу вони не дозволяють змінювати IISконфігурації.
|
Тільки при використанні application / json як типу MIME я маю таке (станом на листопад 2011 року з найновішими версіями Chrome, Firefox з Firebug):
Немає більше попереджень від Chrome, коли JSON завантажується з сервера.
Firebug додасть вкладку до відповіді, показуючи вам дані JSON
відформатовано. Якщо тип MIME відрізняється, він просто відображатиметься як
'Зміст відповіді'.
|
Не все працює для типу вмісту application / json.
Якщо ви використовуєте форму Ext JS для надсилання у файл для завантаження, пам’ятайте, що браузер аналізує відповідь сервера, щоб створити документ для